﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using Go.Tools;
using Go.Model;
using tpGo;


namespace tpGo
{
    public partial class Tablero : Form, IObserver
    {
        public static int UPOFFSET = offset;
        public static int LEFTOFFSET = offset;
        public static int DIMENSION = 9;
        private static int a = 400;
        public static int HEIGHT = (int)(a / DIMENSION);
        public static int FIGUREHEIGHT = (int)(7 * HEIGHT) / DIMENSION;
        public static int offset = HEIGHT;
        public int BOARDSIZE = ((HEIGHT * DIMENSION) - HEIGHT);
        public Player actualPlayer;
        private Game game;
        
        private System.ComponentModel.Container components = null;
        Dictionary<Coordinate, Intersection> board = new Dictionary<Coordinate, Intersection>();
        Dictionary<Coordinate, Position> board_modelo = BoardFactory.createBoard(DIMENSION);
        public static String DIRECTORY=  ImageConstants.DIRECTORY;
        public static String IMAGEWHITESTONE =DIRECTORY+ "piedraBlanca.png";
        public static String IMAGEBLACKSTONE = DIRECTORY + "piedraNegra.png";

        //metodos.
        public void DrawTablero(Graphics G)
        {           
            int xInicial;
            int xFinal;
            int yInicial;
            int yFinal;
            int Y = 0, X = 0;
            for (int i = 0; i < (DIMENSION - 1); i++)
            {
                yInicial = Y;
                Y = i * HEIGHT;
                for (int j = 0; j < (DIMENSION - 1); j++)
                {            
                    yFinal =  Y;
                    xInicial = X;
                    X = j * HEIGHT;
                    xFinal = X;
                    CuadroGo unCuadro = new CuadroGo(xInicial, xFinal, yInicial,yFinal);
                    unCuadro.puntoInicialGrafico = new Point(X+offset, Y+offset);
                    unCuadro.FillCuadro(G, HEIGHT);
                }               
                //X = X + altura;           
            }
            //creo el tablero y lleno las posiciones de las intersecciones.
            board = InterBoard.createTablero(DIMENSION, HEIGHT, this);
        }

        public Point centrarImagen(Point punto)
        {
            punto.X = punto.X - FIGUREHEIGHT/2;
            punto.Y = punto.Y - FIGUREHEIGHT/2;
            return punto;
        }

        private void drawBallWhite(Point pto)
        {
            Graphics g = this.CreateGraphics();
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Green);
            Bitmap imagenBolaBlanca;
            imagenBolaBlanca = new Bitmap(IMAGEWHITESTONE);
            imagenBolaBlanca = new Bitmap(imagenBolaBlanca, new Size(FIGUREHEIGHT, FIGUREHEIGHT));
            g.DrawImage(imagenBolaBlanca, pto);
        }

        public void Draw(string source, int weight, int height, Point pto)
        {
            Graphics graphics = this.CreateGraphics();
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Green);
            Bitmap image = new Bitmap(source);
            image = new Bitmap(image, new Size(weight, height));
            graphics.DrawImage(image, pto);
        }

        private void drawBallBlack(Point pto)
        {
            Graphics g = this.CreateGraphics();
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Green);
            Bitmap imagenBolaNegra;
            imagenBolaNegra = new Bitmap(IMAGEBLACKSTONE);
            imagenBolaNegra = new Bitmap(imagenBolaNegra, new Size(FIGUREHEIGHT, FIGUREHEIGHT));
            g.DrawImage(imagenBolaNegra, pto);
        }

        private Position buscarPosicionEnTablero(Point ptoMouse) { 
           // Point punto= buscarPuntoEnTablero(ptoMouse);
            Point punto = buscarCoordenadaEnTablero(ptoMouse);
         //   Point p = new Point();
         //   p.X = 7;
         //   p.Y = 7;
       //     return game.Board[transformPointToCoordinate(p)];
            return game.Board[transformPointToCoordinate(punto)];
        }

        private Coordinate transformPointToCoordinate(Point ptoMouse)
        {
            return Tools.getCoordinate(ptoMouse.X, ptoMouse.Y);
        }

        private Point buscarPuntoEnTablero(Point ptoMouse)
        {
            // Salvedad de que no sea fuera del tablero
            //            posicionNormalidaX > size*altura+OffsetIzq ||posicionNormalidaY > size*altura+OffsetArriba
            Point puntoBuscado = new Point();
            Intersection _intersection;
            Coordinate _coordenada;
            int posicionX = ptoMouse.X;
            int posicionY = ptoMouse.Y;
            int posicionNormalidaX = (posicionX / HEIGHT);
            int posicionNormalidaY = (posicionY / HEIGHT);
            int decimalPosX = (posicionX % HEIGHT);
            int decimalPosY = (posicionY % HEIGHT);
            if (decimalPosX > (HEIGHT / 2)) posicionNormalidaX = posicionNormalidaX + 1;
            if (decimalPosY > (HEIGHT / 2)) posicionNormalidaY = posicionNormalidaY + 1;
            puntoBuscado.X = posicionNormalidaX;
            puntoBuscado.Y = posicionNormalidaY;
            _coordenada.x = puntoBuscado.X;
            _coordenada.y = puntoBuscado.Y;

            if ((_coordenada.x >= 0) && (_coordenada.x <= DIMENSION) && (_coordenada.y >= 0) && (_coordenada.y <= DIMENSION))
            {
                _intersection = board[_coordenada];
                puntoBuscado.X = (_intersection.X * HEIGHT);
                puntoBuscado.Y = (_intersection.Y * HEIGHT);
                return puntoBuscado;

            }
            return new Point();
        }

        private Point buscarCoordenadaEnTablero(Point ptoMouse)
        {
            // Salvedad de que no sea fuera del tablero
            //            posicionNormalidaX > size*altura+OffsetIzq ||posicionNormalidaY > size*altura+OffsetArriba
            Point puntoBuscado = new Point();
            Intersection _intersection;
            Coordinate _coordenada;
            int posicionX = ptoMouse.X;
            int posicionY = ptoMouse.Y;
            int posicionNormalidaX = (posicionX / HEIGHT);
            int posicionNormalidaY = (posicionY / HEIGHT);
            int decimalPosX = (posicionX % HEIGHT);
            int decimalPosY = (posicionY % HEIGHT);
            if (decimalPosX > (HEIGHT / 2)) posicionNormalidaX = posicionNormalidaX + 1;
            if (decimalPosY > (HEIGHT / 2)) posicionNormalidaY = posicionNormalidaY + 1;
            puntoBuscado.X = posicionNormalidaX;
            puntoBuscado.Y = posicionNormalidaY;
            _coordenada.x = puntoBuscado.X;
            _coordenada.y = puntoBuscado.Y;

            if ((_coordenada.x >= 0) && (_coordenada.x <= DIMENSION) && (_coordenada.y >= 0) && (_coordenada.y <= DIMENSION))
            {
                _intersection = board[_coordenada];
                return puntoBuscado;

            }
            return new Point();
        }

        public void graficarImagen(Point punto)
        {
            Point newPoint = new Point();           
            //busco el punto en el tablero creado.
            newPoint = buscarPuntoEnTablero(punto);
            if (newPoint.X == 0)
            {
                //TODO: Aca se deberia manejar con alguna excepcion para que no pase el turno.
                //Esto sucede cuando tocamos fuera del mapa
                String error = "Estoy afuera";
                
            }
            else
            {
                newPoint = centrarImagen(newPoint);
              // if (actualPlayer.Color.CompareTo("Black") != 0)
                    drawBallWhite(newPoint);
            //   else
               //     drawBallBlack(newPoint);
            }
        }


        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (actualPlayer == null)
                return;
            Point punto=new Point();
            punto.X = e.X;
            punto.Y = e.Y;
            //TODO VER QUE NO SE VAYA SEL TABLERO!.
            if ((punto.X > LEFTOFFSET) && (punto.Y > UPOFFSET))
            {
                actualPlayer.setMove(buscarPosicionEnTablero(punto));
                graficarImagen(punto);
            }   
        }

        public Tablero(Game game)
        {
            actualPlayer = game.players().ToArray()[0];
            this.game = game;
            InitializeComponent();
            game.play();
        }

        public void Update(Object sender) {
            if (actualPlayer == null)
                actualPlayer = (Player)sender;
            else
                actualPlayer = null;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Tablero_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Hide();
            this.Close();
            Form form1 = new Form1();
            form1.ShowDialog();
          
        }
    }
}
